# -*- coding: utf-8 -*-
# @Author : HaleShi
# @Time : 2023-05-23
# @File : 8.jsonpath处理爬取数据.py

import json
import jsonpath

import Utils.文本_生成器

PATH = "./8.得物推荐列表.json"

with open(PATH, 'r', encoding='utf-8') as f:
    data = f.read()
    data = json.loads(data)

# 基于JsonPath获取元素：通过jsonpath函数来获取（json数据，定位表达式）
"""
    jsonpath表达式的基本格式规范：
        $ 表示根节点，也是所有jsonpath表达式的开始
        . 表示获取子节点
        .. 表示获取所有符合条件的内容
        *  代表所有的元素节点
        [] 表示迭代器的标示（可以用于处理下标等情况）
        [,] 表示多个结果的选择
        ?() 表示过滤操作
        @ 表示当前节点
"""
DATA_USERINFO = jsonpath.jsonpath(data, '$.data..feed.userInfo')
CONTENT_LIST = jsonpath.jsonpath(data, '$.data..feed.content')

def iter_datalist(datas):
    for info in datas:
        yield info


def run():
    gen_object_info = iter_datalist(DATA_USERINFO)
    gen_object_content = iter_datalist(CONTENT_LIST)
    for index, info in enumerate(gen_object_info):
        print("这是第 {} 条数据,下面是其内容：\n{}".format(index + 1, info))
        input('------请按任何按键,获取下一条数据内容------\n\n')


if __name__ == '__main__':
    run()

'''
多种使用方法
book = jsonpath.jsonpath(data, '$.store.book')
print(book)
# 获取store下所有的price节点的值
price = jsonpath.jsonpath(data, '$.store..price')
print(price)
# 连接操作符，在xpath中 结果合并其他结果的集合。JSONPATH允许name或者数据索引。类似于xpath |
book_price = jsonpath.jsonpath(data, '$.store.book[0,1,2].price')
# 切片遵循list的切片规则
book_price1 = jsonpath.jsonpath(data, '$.store.book[0:3].price')
print(book_price)
print(f'book_price1:{book_price1}')
# 获取price大于10的所有book
book_1 = jsonpath.jsonpath(data, '$..book[?(@.price>10)]')
print(book_1)
# 这是一条错误的JsonPath
book_2 = jsonpath.jsonpath(data, '$..展昭[?(@.price>10)]')
print(book_2)
print(type(book_2))
print(type(data))
'''''''''
